home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / TARFILE.GZ / tarfile / ch_3.6 / subsample / smoothr.c < prev    next >
C/C++ Source or Header  |  1999-09-11  |  2KB  |  68 lines

  1. /* 
  2.  * smoothr.c
  3.  * 
  4.  * Practical Algorithms for Image Analysis
  5.  * 
  6.  * Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
  7.  */
  8.  
  9. /* SMOOTHR:     function performs 2-D smoothing by separable, 1-D averaging
  10.  *            and returns subsampled image
  11.  *                  usage: smoothr (imgI, imgO, nFltr, rSubsample)
  12.  */
  13.  
  14. #include <images.h>
  15. #include <tiffimage.h>
  16.  
  17. void
  18. smoothr (imgI, imgO, nFltr, rSubsample)
  19.      Image *imgI, *imgO;        /* input,output image structures */
  20.      long nFltr;                /* number of filter coefficients */
  21.      long rSubsample;           /* subsample rate */
  22. {
  23.   Image *imgT;                  /* intermediate image structure */
  24.   unsigned char **imgIn,        /* input image */
  25.   **imgTi,                      /* intermediate image */
  26.   **imgOut;                     /* output image */
  27.   long width, height;           /* size of image */
  28.   long sum;                     /* sum of filter convolution at a pixel */
  29.   long midFltr;                 /* middle coefficient index of filter */
  30.   long xEnd, yEnd;              /* end coefficients of convolution */
  31.   long xOut, yOut;              /* output image coordinates */
  32.   long x, y, i;
  33.  
  34. /* initialize images */
  35.   imgIn = ImageGetPtr (imgI);   /* input image */
  36.   height = ImageGetHeight (imgI);
  37.   width = ImageGetWidth (imgI);
  38.   imgT = ImageAlloc (height, width, 8);  /* intermediate image */
  39.   imgTi = ImageGetPtr (imgT);
  40.   imgOut = ImageGetPtr (imgO);  /* output image */
  41.  
  42. /* perform row-wise smoothing */
  43.   midFltr = (nFltr - 1) / 2;
  44.   xEnd = width - midFltr;
  45.   for (y = 0; y < height; y++) {
  46.     for (x = midFltr; x < xEnd; x += rSubsample) {
  47.       sum = imgIn[y][x];
  48.       for (i = 1; i <= midFltr; i++)
  49.         sum += imgIn[y][x - i] + imgIn[y][x + i];
  50.       imgTi[y][x] = (unsigned char) (sum / nFltr);
  51.     }
  52.   }
  53.  
  54. /* perform column-wise convolution */
  55.   yEnd = height - midFltr;
  56.   for (y = midFltr, yOut = 0; y < yEnd; y += rSubsample) {
  57.     for (x = midFltr, xOut = 0; x < xEnd; x += rSubsample) {
  58.       sum = imgTi[y][x];
  59.       for (i = 1; i <= midFltr; i++)
  60.         sum += imgTi[y - i][x] + imgTi[y + i][x];
  61.       imgOut[yOut][xOut++] = (unsigned char) (sum / nFltr);
  62.     }
  63.     yOut++;
  64.   }
  65.  
  66.   return;
  67. }
  68.